#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pp;
const int N=1e5+10;
int n,m;
struct edge {
    int to;
    int next;
    int id;
} edges[N<<1];  // 修正1：确保双向边空间足够
bool st[N];
int cnt=1;
vector<int> pathnode;
vector<int> pathside;
int head[N];
vector<pp> ques;
int cntside[N];

void add(int u,int v,int id) {
    edges[cnt].id = id;
    edges[cnt].to = v;
    edges[cnt].next = head[u];
    head[u] = cnt++;
}

bool dfs(int s,int end) {
    st[s] = true;
    pathnode.push_back(s);
    if(s == end) return true;
    
    for(int i=head[s]; i!=-1; i=edges[i].next) {
        int j = edges[i].to;
        int cid = edges[i].id;
        if(!st[j]) {
            pathside.push_back(cid);  // 修正2：先记录边
            if(dfs(j, end)) return true;
            pathside.pop_back();     // 回溯时移除
        }
    }
    st[s] = false;        // 修正3：统一回溯处理
    pathnode.pop_back();
    return false;
}

void init() {
    memset(st, 0, sizeof(st));
    pathnode.clear();
    pathside.clear();
}

int main() {
    memset(head, -1, sizeof(head));
    cin >> n >> m;
    for(int i=1; i<=n-1; i++) {
        int u, v;
        cin >> u >> v;
        add(u, v, i);
        add(v, u, i);
    }
    for(int i=0; i<m; i++) {
        int a, b;
        cin >> a >> b;
        ques.push_back({a, b});
    }
    for(int i=0;i<m;i++)
    {
        init();
        if(dfs(ques[i].first,ques[i].second))
        {
            for(auto&ch:pathside) cntside[ch]++;
        }
    }
    for(int i=n-1;i>=1;i--)
    {
        if(cntside[i]==m) 
        {
            cout<<i<<endl;
            return 0;
        }
    }
    cout<<-1<<endl;
    return 0;
}